import axios from 'axios';
import { ServiceType, getServiceConfig, MedicalSceneType, getMedicalSceneServiceUrl } from './services';

// 创建不同服务的axios实例
const createServiceInstance = (serviceType) => {
  const config = getServiceConfig(serviceType);
  return axios.create({
    baseURL: config.baseUrl,
    timeout: config.timeout,
    headers: {
      'Content-Type': 'application/json'
    }
  });
};

// 创建医学场景特定的axios实例
const createMedicalSceneInstance = (sceneType) => {
  const baseUrl = getMedicalSceneServiceUrl(sceneType);
  return axios.create({
    baseURL: baseUrl,
    timeout: 300000,  // 基本单位是ms, =5 min
    headers: {
      'Content-Type': 'application/json'
    }
  });
};

/**
 * 获取数据集列表
 * @returns {Promise<Array>} 返回数据集列表
 */
export const fetchDatasets = async () => {
  try {
    const instance = createServiceInstance(ServiceType.DATASET);
    const response = await instance.get('/datasets');
    return response.data;
  } catch (error) {
    console.error('获取数据集列表失败:', error);
    throw new Error('无法获取数据集列表');
  }
};

/**
 * 获取特定数据集详情
 * @param {string} datasetId - 数据集ID
 * @returns {Promise<Object>} 返回数据集详情
 */
export const fetchDatasetDetail = async (datasetId) => {
  try {
    const instance = createServiceInstance(ServiceType.DATASET);
    const response = await instance.get(`/datasets/${datasetId}`);
    return response.data;
  } catch (error) {
    if (error.response?.status === 404) {
      throw new Error('数据集未找到');
    }
    console.error('获取数据集详情失败:', error);
    throw new Error('无法获取数据集详情');
  }
};

/**
 * 获取数据集中特定图像的数据的完整URL
 * @param {string} datasetId - 数据集ID
 * @param {string} imageId - 图像ID
 * @returns {string} 返回可用于<img>标签src属性的URL
 */
export const getImageUrl = (datasetId, imageId) => {
  const config = getServiceConfig(ServiceType.IMAGE);
  return `${config.baseUrl}/datasets/${datasetId}/images/${imageId}/data`;
};

/**
 * 运行医学图像处理任务
 * @param {string} clinicalscene - 临床场景ID
 * @param {string} taskId - 任务ID
 * @param {Object} parameters - 任务参数
 * @param {string} imageUrl - 图像数据URL
 * @returns {Promise<Object>} 返回任务结果
 */
export const runTaskAPI = async (clinicalscene, taskId, parameters, imageUrl) => {
  try {
    // 根据临床场景类型选择对应的后端服务
    // 这里可以根据clinicalscene参数映射到具体的医学场景类型
    let sceneType = MedicalSceneType.GENERAL;

    // 示例映射逻辑，根据实际场景调整
    if (clinicalscene.includes('pneumonia')) {
      sceneType = MedicalSceneType.PNEUMONIA;
      const instance = createMedicalSceneInstance(sceneType);
      const response = await instance.post('/medical-scenes/scenes/pneumonia/process', {
        image_data: imageUrl,   // 前端传输url
        scene_id: clinicalscene,
        parameters: {
          task_id: taskId,
          ...parameters  // 注意要和后端代码匹配
        }
      });
      return response.data;
    }
    else {
      const instance = createMedicalSceneInstance(sceneType);
      const response = await instance.post('/medical-scenes/process', {
        image_data: imageUrl,   // 前端传输url
        scene_id: clinicalscene,
        parameters: {
          task_id: taskId,
          ...parameters  // 注意要和后端代码匹配
        }
      });
      return response.data;
    }

  } catch (error) {
    console.error('运行任务失败:', error);
    if (error.response) {
      // 服务器响应了错误状态码
      console.error('错误状态:', error.response.status);
      console.error('错误数据:', error.response.data);
    } else if (error.request) {
      // 请求已发出但没有收到响应
      console.error('无响应:', error.request);
    } else {
      // 其他错误
      console.error('错误信息:', error.message);
    }
    throw new Error(`无法运行任务: ${error.message}`);
  }
};

/**
 * 获取分割mask的完整URL
 * @param {string} maskPath - mask文件相对路径（如 "results/copd/seg_result/mask_20251012_202820.nii.gz"）
 * @returns {string} 返回可用于Niivue加载的mask URL
 */
export const getMaskUrl = (maskUrl) => {
  // 添加参数验证
  if (!maskUrl) {
    console.warn('getMaskUrl - 接收到空的maskUrl');
    return '';
  }

  // 尝试多种可能的 URL 配置
  const resultsConfig = getServiceConfig(ServiceType.RESULTS);

  // 1. 去掉可能的前导 /
  const cleanPath = maskUrl.startsWith('/') ? maskUrl.slice(1) : maskUrl;
  // 2. 直接使用 RESULTS 服务配置,让后端返回前端的路径就是url格式的
  const url = `${resultsConfig.baseUrl}/${cleanPath}`;

  console.log('getMaskUrl - final URL:', url);

  return url;
};


/**
 * 获取分割结果中所有mask的URL
 * @param {Array} segmentations - 分割结果数组
 * @returns {Array} 返回包含mask URL的对象数组
 */
export const getMaskUrls = (segmentations) => {
  if (!segmentations || !Array.isArray(segmentations)) return [];

  return segmentations.map(seg => ({
    ...seg,
    maskUrl: getMaskUrl(seg.mask)
  }));
};


// /**
//  * 测试 mask URL 是否可访问
//  * @param {string} maskUrl - mask文件URL
//  * @returns {Promise<boolean>} 返回是否可访问
//  */
// export const testMaskUrl = async (maskUrl) => {
//   try {
//     // 首先尝试 HEAD 请求
//     let response = await fetch(maskUrl, { method: 'HEAD' });

//     // 如果 HEAD 请求返回 405 Method Not Allowed，尝试 GET 请求
//     if (response.status === 405) {
//       console.log('testMaskUrl - HEAD 不支持，尝试 GET 请求...');
//       response = await fetch(maskUrl, {
//         method: 'GET',
//         headers: { 'Range': 'bytes=0-0' } // 只请求第一个字节
//       });
//     }

//     console.log('testMaskUrl - status:', response.status);
//     console.log('testMaskUrl - headers:', Object.fromEntries(response.headers.entries()));
//     return response.ok;
//   } catch (error) {
//     console.error('testMaskUrl - error:', error);
//     return false;
//   }
// };
